const config = require("./config");
let mqttApi = require("./mqtt.min1");
let { http } = require("./request");
const MQTT = {
  mqttClient: null,
  /** 
   * 连接mqtt 初始化
   * clientId:  客户id
   * openid: openid
  */
  connectMQTT(clientId,openid,msgCallback){
    let connectUrl = "wxs://81.71.143.252:8084/mqtt";
    // let connectUrl = "wxs://emq.huachuangshidai.com/mqtt";
    this.mqttClient = mqttApi.connect(connectUrl,{
      //为 false 时表示创建一个持久会话，在客户端断开连接时，会话仍然保持并保存离线消息，直到会话超时注销, (不能使用动态ClientID)
      //为 true 时表示创建一个新的临时会话，在客户端断开时，会话自动销毁。(ClientID可以使用随机uuid)
      clean: true, 
      keepalive: 0, //保活周期 是一个以秒为单位的时间间隔。
      protocolVersion: 4, //MQTT连接协议版本
      connectTimeout: 5000, //连接超时时长,等待时间内未收到连接确认则为连接失败。
      reconnectPeriod: 10000, //两次重新连接之间的间隔
      clientId: clientId, //客户端ID
      username: 'xcx', //用户名
      password: 'xcx:3-2=1', //密码
    })
    if(this.mqttClient){
      //连接成功时触发
      this.mqttClient.on('connect', function (connack) {
        console.log('mqtt：success')
        if(MQTT.mqttClient && MQTT.mqttClient.subscribe){
          // 订阅答题成功
          MQTT.mqttClient.subscribe(openid,{pos:2},function(err){
            if(!err){
              console.log('mqtt：订阅成功',openid)
            }
          })
        }
      })
      // 当断开连接后，经过重连间隔时间重新自动连接到 Broker 时触发
      this.mqttClient.on('reconnect', function () {
        console.log('mqtt：reconnecting')
      })
      // 在断开连接以后触发
      this.mqttClient.on('close', function () {
        console.log('mqtt：close')
      })
      // 当客户端下线时触发
      // this.mqttClient.on('offline', function () {
      //   console.log('mqtt：offline')
      // })
      // 当客户端无法成功连接时或发生解析错误时触发，参数 error 为错误信息
      this.mqttClient.on('error', function (error) {
        console.log('mqtt：error', error)
      })
      // 当客户端收到一个发布过来的 Payload 时触发，其中包含三个参数，topic、payload 和 packet，其中 topic 为接收到的消息主题，payload为接收到的消息内容，packet为 MQTT报文信息，其中包含 QoS、retain 等信息
      this.mqttClient.on('message', function (topic, payload, packet) {
        // Payload is Buffer
        let message = JSON.parse(payload.toString());
        msgCallback(topic,message);
      })
    }
  },

  /** mqtt 发送消息 */
  send(topic,message){
    if(!this.mqttClient){
      return http.showToast("发送失败");
    }
    // Client.publish(topic, message, [options], [callback]) 发送消息 包含四个参数：
    // topic: 要发送的主题，为字符串
    // message: 要发送的主题的下的消息，可以是字符串或者是 Buffer
    // options: 可选值，发布消息时的配置信息，主要是设置发布消息时的 QoS、Retain 值等。
    // callback: 发布消息后的回调函数，参数为 error，当发布失败时，该参数才存在
    this.mqttClient.publish(topic, message, { qos: 2, retain: false }, function (error) {
      if (error) {
        console.log(error)
      }
    })
  },
  /** mqtt 关闭客户端 */
  disconnect(){
    // Client.end([force], [options], [callback]) 关闭客户端，该方法包含三个参数:
    // force: 设置为true时将立即关闭客户端，而无需等待断开连接的消息被接受。这个参数是可选的，默认为false。注意：使用该值为true时，Broker无法接收到disconnect的报文
    // options: 可选值，关闭客户端时的配置信息，主要是可以配置 reasonCode，断开连接时的 Reason Code
    // callback: 当客户端关闭时的回调函数
    if(this.mqttClient && this.mqttClient.connected){
      this.mqttClient.end(true,{qos:2},function(){});
      console.log("mqtt: 关闭成功")
    }
    this.mqttClient = null;
  },
  /** 将buffer转换成字符串 */
  ab2hex(buffer){
    let hexArr = Array.prototype.map.call(new Uint8Array(buffer),function(bit){
      return ('00' + bit.toString(16)).slice(-2);
    })
    return hexArr.join('');
  },

};

module.exports = {
  mqtt: MQTT
}